package wei.qiang.ye.serverconsumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import wei.qiang.ye.serverconsumer.domain.User;

import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class UserController {
    @Autowired
    private RestTemplate restTemplate;

//    /**
//     * getForEntity(String url, Class<T> responseType, Object... uriVariables)；
//     * @param id
//     * @return
//     */
//    @GetMapping("user/{id:\\d+}")
//    public User getUser1(@PathVariable Long id) {
//        return this.restTemplate.getForEntity("http://Server-Provider/user/{id}", User.class, id).getBody();
//    }
//
//    /**
//     * getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
//     * @param id
//     * @return
//     */
//    @GetMapping("user/{id:\\d+}")
//    public User getUser2(@PathVariable Long id) {
//        Map<String, Object> params = new HashMap<>();
//        params.put("id", id);
//        return this.restTemplate.getForEntity("http://Server-Provider/user/{id}", User.class, params).getBody();
//    }

    /**
     * getForEntity(URI url, Class<T> responseType)
     * @param id
     * @return
     */
    @GetMapping("user/{id:\\d+}")
    public User getUser(@PathVariable Long id) {
        Map<String, Object> params = new HashMap<>();
        params.put("id", id);
        URI uri = UriComponentsBuilder.fromUriString("http://Server-Provider/user/{id}")
                .build().expand(params).encode().toUri();
        return this.restTemplate.getForEntity(uri, User.class).getBody();
    }

    /**
     * getForObject方法和getForEntity方法类似，getForObject方法相当于getForEntity方法调用了getBody方法，
     * 直接返回结果对象，为不是ResponseEntity对象。
     * @return
     */

    @GetMapping("user")
    public List<User> getUsers() {
        return this.restTemplate.getForObject("http://Server-Provider/user", List.class);
    }

    @GetMapping("user/add")
    public String addUser() {
        User user = new User(1L, "mrbird", "123456");
        HttpStatus status = this.restTemplate.postForEntity("http://Server-Provider/user", user, null).getStatusCode();
        if (status.is2xxSuccessful()) {
            return "新增用户成功";
        } else {
            return "新增用户失败";
        }
    }

    /**
     *在RESTful风格的接口中，判断成功失败不再是通过返回值的某个标识来判断的，而是通过返回报文的状态码是否为200来判断。
     * 当这个方法成功执行并返回时，返回报文状态为200，即可判断方法执行成功。
     */
    @GetMapping("user/update")
    public void updateUser() {
        User user = new User(1L, "mrbird", "123456");
        this.restTemplate.put("http://Server-Provider/user", user);
    }

    @GetMapping("user/delete/{id:\\d+}")
    public void deleteUser(@PathVariable Long id) {
        this.restTemplate.delete("http://Server-Provider/user/{1}", id);
    }



}
